package com.kt.learn1

/**
 * Kotlin 密封类与数据类示例
 * 包括数据类的使用、密封类的定义和使用等
 */

fun main() {
    // 数据类
    chapter1DataClasses()

    // 密封类
    chapter2SealedClasses()
}

// 数据类
fun chapter1DataClasses() {
    println("\n===== 数据类 =====")

    // 定义一个数据类
    data class User(val name: String, val age: Int)

    // 创建数据类对象
    val user1 = User("Alice", 30)
    val user2 = User("Bob", 25)

    // 打印对象信息
    println(user1) // 输出：User(name=Alice, age=30)
    println(user2) // 输出：User(name=Bob, age=25)

    // 比较两个对象
    println("user1 == user2: ${user1 == user2}") // 输出：user1 == user2: false

    // 复制对象
    val user1Copy = user1.copy(age = 35)
    println("user1Copy: $user1Copy") // 输出：user1Copy: User(name=Alice, age=35)

    // 解构声明
    val (name, age) = user1
    println("Name: $name, Age: $age") // 输出：Name: Alice, Age: 30
}

// 定义一个密封类
sealed class NetworkState {
    object Loading : NetworkState()
    data class Success(val data: String) : NetworkState()
    data class Error(val message: String) : NetworkState()
}

// 密封类
fun chapter2SealedClasses() {
    println("\n===== 密封类 =====")



    // 处理网络状态
    fun handleNetworkState(state: NetworkState) {
        when (state) {
            is NetworkState.Loading -> println("当前状态：Loading... 正在加载数据")
            is NetworkState.Success -> println("当前状态：Success! 数据内容：${state.data}")
            is NetworkState.Error -> println("当前状态：Error! 错误信息：${state.message}")
        }
    }

    // 创建不同类型的网络状态
    val loadingState = NetworkState.Loading
    val successState = NetworkState.Success("用户数据加载成功！")
    val errorState = NetworkState.Error("网络连接失败！")

    // 处理网络状态
    handleNetworkState(loadingState)
    handleNetworkState(successState)
    handleNetworkState(errorState)
}